/**
 ******************************************************************************
 * @file           : bsp_dac.h
 * @brief          : DAC Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * DAC驱动头文件
 * 12位分辨率，双通道，支持DMA
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_DAC_H
#define __BSP_DAC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/DAC/bsp_dac_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief DAC错误码枚举
 */
typedef enum
{
    DAC_OK = 0,                 /*!< 成功 */
    DAC_ERROR_PARAM,            /*!< 参数错误 */
    DAC_ERROR_BUSY,             /*!< DAC忙 */
    DAC_ERROR_HAL               /*!< HAL库错误 */
} DAC_Error_e;

/**
 * @brief DAC通道枚举
 */
typedef enum
{
    DAC_CH_1 = 0,                   /*!< DAC通道1 (PA4) */
    DAC_CH_2                        /*!< DAC通道2 (PA5) */
} DAC_Channel_e;

/**
 * @brief DAC对齐方式枚举
 */
typedef enum
{
    DAC_ALIGN_12B_R = 0,            /*!< 12位右对齐 */
    DAC_ALIGN_12B_L,                /*!< 12位左对齐 */
    DAC_ALIGN_8B_R                  /*!< 8位右对齐 */
} DAC_Align_e;

/* Exported constants --------------------------------------------------------*/

/**
 * @brief DAC分辨率相关常量
 */
#define DAC_MAX_VALUE_12BIT     4095    /*!< 12位最大值 */
#define DAC_MAX_VALUE_8BIT      255     /*!< 8位最大值 */

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化和去初始化 */
void dac_init(DAC_Channel_e channel);
void dac_deinit(DAC_Channel_e channel);

/* 输出函数 */
void dac_set_value(DAC_Channel_e channel, uint16_t value);
void dac_set_voltage(DAC_Channel_e channel, uint16_t voltage_mv);

/* 波形生成 */
void dac_output_triangle_wave(DAC_Channel_e channel, uint16_t amplitude);
void dac_output_noise_wave(DAC_Channel_e channel, uint16_t amplitude);

/* 调试接口 */
void dac_print_status(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DAC_H */
